package generics;

import java.util.ArrayList;
import java.util.List;

// 复用Fruit、Apple、Banana类（见上例）
class RedApple extends Apple {}

public class LowerBoundedWildcard {
    // 下界通配符：只能接收Apple或其父类的List
    public static void addApples(List<? super Apple> list) {
        // 可以安全添加Apple及其子类
        list.add(new Apple());
        list.add(new RedApple()); // RedApple是Apple的子类
    }

    public static void main(String[] args) {
        List<Fruit> fruitList = new ArrayList<>();
        List<Apple> appleList = new ArrayList<>();
        List<Object> objectList = new ArrayList<>();

        // 下界通配符可以接收Apple及其父类的List
        addApples(fruitList);
        addApples(appleList);
        addApples(objectList);

        System.out.println("水果列表大小：" + fruitList.size()); // 2
        System.out.println("苹果列表大小：" + appleList.size()); // 2

        // 注意：下界通配符的集合读取时只能用Object接收
        for (Object obj : appleList) {
            // 需要转型才能使用具体类型
            if (obj instanceof Apple) {
                Apple apple = (Apple) obj;
            }
        }

        // 错误：Banana是Fruit的子类，但不是Apple的父类
        // List<Banana> bananaList = new ArrayList<>();
        // addApples(bananaList); // 编译错误
    }
}
